package cuatroenlinea.com.correosocial;

import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class LocationActivity extends ActionBarActivity
{
    Boolean desactivarGPSPendiente = false;
    Boolean gpsActivado = false;
    LocationManager manager;
    LocationListener listener;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_location);

        ActivarGPS();
    }

    public void ActualizarAhoraOnClick(View view)
    {
        ActivarGPS();

        desactivarGPSPendiente = true;
    }

    public void ActivarDesactivarOnClick(View view)
    {
        CheckBox checkBoxActualizarAuto = (CheckBox) this.findViewById(R.id.checkBoxActualizarAuto);

        if (checkBoxActualizarAuto.isChecked())
            ActivarGPS();
        else
            DesactivarGPS();
    }

    public void ActualizarPosicion(final Location posicion)
    {
        final TextView textViewLocationMensaje  = (TextView) this.findViewById(R.id.textViewLocationMensaje);

        final String nombreDeUsuario = this.getIntent().getStringExtra("nombreDeUsuario");
        final String contrasenia = this.getIntent().getStringExtra("contrasenia");

        /* defino un thread para hacer el login */
        Thread t = new Thread() {
            MensajeDeResultado resultado;

            @Override
            public void run() {

                String NAMESPACE = "http://correosocial.com/";
                String URL = "http://webservice.correosocial.com.ar/correosocialwebservice.svc";
                String METHOD_NAME = "ActualizarPosicion";
                String SOAP_ACTION = "http://correosocial.com/ICorreoSocialWebService/ActualizarPosicion";

                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                request.addProperty("nombreDeUsuario", nombreDeUsuario);
                request.addProperty("contrasenia", contrasenia);

                request.addProperty(getLocationProperty("latitud", posicion.getLatitude()));
                request.addProperty(getLocationProperty("longitud", posicion.getLongitude()));

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
                envelope.dotNet = true;

                envelope.setOutputSoapObject(request);

                HttpTransportSE transporte = new HttpTransportSE(URL);

                try {

                    transporte.call(SOAP_ACTION, envelope);

                    SoapPrimitive respuesta = (SoapPrimitive) envelope.getResponse();

                    resultado = new MensajeDeResultado(respuesta);

                }
                /* luego puede que use solo una excepción genérica */
                catch (Exception ex) {
                    resultado = new MensajeDeResultado(ex, "Error al actualizar posición");
                }

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textViewLocationMensaje.setText(resultado.GetMensaje());
                    }
                });

            }

        };

        textViewLocationMensaje.setText("Conectando...");

        /* intento hacer el login */
        t.start();

        if (!desactivarGPSPendiente)
            return;

        desactivarGPSPendiente = false;
        DesactivarGPS();
    }

    private PropertyInfo getLocationProperty(String nombre, Double valor)
    {
        PropertyInfo pi = new PropertyInfo();

        Locale locale = new Locale("en","US");

        DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(locale);

        format.applyLocalizedPattern("#.########################");

        pi.setName(nombre);
        pi.setValue(format.format(valor));

        return pi;
    }

    private void DesactivarGPS()
    {
        manager.removeUpdates(listener);

        gpsActivado = false;

        final TextView textViewLocationMensaje  = (TextView) this.findViewById(R.id.textViewLocationMensaje);

        textViewLocationMensaje.setText("Actualizaciones desactivadas.");
    }

    private void ActivarGPS()
    {
        manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        listener = new CorreoSocialLocationListener(this);

        // milisegundos / metros
        // 60000 un minuto
        // 5000 cinco segundos
        // 1000 un segundo
        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 5, listener);

        gpsActivado = true;

        final TextView textViewLocationMensaje  = (TextView) this.findViewById(R.id.textViewLocationMensaje);

        textViewLocationMensaje.setText("Actualizaciones activadas.");
    }
}
